 #ifndef __CAMERA_H
#define __CAMERA_H

 
 #include <stdio.h> 
 #include <stdlib.h> 
 #include <sys/types.h> 
 #include <sys/stat.h> 
 #include <fcntl.h> 
 #include <unistd.h> 
 #include <sys/ioctl.h> 
 #include <string.h> 
 #include <errno.h> 
 #include <sys/mman.h>
 #include <linux/videodev2.h> 
 #include <linux/fb.h>
#include "define_config.h"
  
 #define FB_DEV                            "/dev/fb0" 
 #define FRAMEBUFFER_COUNT      3            // 定义使用的帧缓冲区数量，选择 3 个缓冲区进行循环切换
#define  ADDRESS_VIDEO  "/dev/video1"


struct camera_format { 
     unsigned char description[32];    // 用于保存视频格式的描述信息
     unsigned int pixelformat;         // 像素格式，定义摄像头采集数据的颜色格式
 };
 typedef struct cam_buf_info { 
     unsigned short *start;            // 帧缓冲区的起始地址，保存每一帧图像的内存位置
     unsigned long length;             // 帧缓冲区的长度，表示每一帧图像的大小
 } cam_buf_info; 
 
 static int width;  // 屏幕宽度（通过 framebuffer 获取）
 static int height; // 屏幕高度（通过 framebuffer 获取）
 static unsigned short *screen_base = NULL; // 帧缓冲区的基地址，指向显示区域的内存
 static int lcd_fd; // 帧缓冲设备文件描述符
 
 static int v4l2_fd; // 摄像头设备文件描述符
 static cam_buf_info buf_infos[FRAMEBUFFER_COUNT]; // 存储各个缓冲区的信息
 static struct camera_format cam_fmt[10]; // 存储摄像头支持的格式信息
 static int frm_width, frm_height; // 摄像头实际的帧宽和帧高
 


 void camera_use(int argc, char *argv[]);
 void camera_init(void);
 static void v4l2_read_data(void);
 static int v4l2_stream_off(void);
static int v4l2_stream_on(void);
 static int v4l2_init_buffer(void);
 static void v4l2_set_format(void);
 static void v4l2_print_formats(void);
static void v4l2_enum_formats(void);
static int v4l2_dev_init(const char *device);
 static int fb_dev_init(void);



#endif 